//
//  ZYMachExceptionHandler.h
//  ZYWebImage
//
//  Created by wangzhipan on 2025/5/3.
//  处理Mach异常

#import <Foundation/Foundation.h>

/*
 Mach异常是iOS系统底层的异常机制，比信号处理更底层，能够捕获到更多类型的崩溃:
 
 Mach异常处理的核心原理是：

 1. 创建一个专门的线程来监听Mach异常
 2. 通过Mach消息机制接收异常通知
 3. 将Mach异常转换为可读的崩溃信息
 4. 生成崩溃报告
 
 Mach异常是iOS/macOS系统中最底层的异常类型，主要包括：

 - EXC_BAD_ACCESS : 内存访问错误，如访问已释放的内存或非法地址
 - EXC_BAD_INSTRUCTION : 非法指令，如执行了无效的CPU指令
 - EXC_ARITHMETIC : 算术错误，如除零
 - EXC_BREAKPOINT : 断点异常
 - EXC_CRASH : 系统强制终止应用
 - EXC_RESOURCE : 资源限制异常
 - EXC_GUARD : 内核保护异常
 
 实现步骤：
 - 异常产生 ：当应用程序执行过程中发生错误（如访问无效内存地址）时，CPU会触发一个硬件异常。
 - 内核捕获 ：Mach内核捕获这个硬件异常，并将其转换为Mach异常。
 - 异常消息发送 ：内核会查找为当前任务注册的异常端口，并向该端口发送异常消息。
 - 异常处理 ：监听该异常端口的线程接收到异常消息，进行处理（如生成崩溃报告）。
 - 处理完成 ：处理完成后，可以选择回复消息（通常在崩溃捕获场景中不需要）或直接终止应用
 
 步骤：
 - 创建异常端口 ：使用 mach_port_allocate 创建一个接收端口。
 - 添加发送权限 ：使用 mach_port_insert_right 为端口添加发送权限。
 - 注册异常处理器 ：使用 task_set_exception_ports 将创建的端口注册为任务的异常端口，并指定要捕获的异常类型。
 - 创建处理线程 ：创建一个专门的线程来监听异常端口。
 - 接收异常消息 ：在处理线程中使用 mach_msg 函数阻塞等待异常消息。
 - 解析异常信息 ：从接收到的消息中提取异常类型和代码等信息。
 - 生成崩溃报告 ：根据异常信息生成崩溃报告。
 - 终止应用 ：通常在处理完异常后使用 kill 函数终止应用程序
 */

NS_ASSUME_NONNULL_BEGIN

@interface ZYMachExceptionHandler : NSObject
- (BOOL)install;
- (void)uninstall;
@end

NS_ASSUME_NONNULL_END
